package com.realm;

import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 自定义的Realm 可以做认证、授权
 */
@Slf4j
public class MyRealm1 extends AuthorizingRealm {
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //获取登录成功之后的用户名 再去数据库中获取对应的角色、权限


        return null;
    }

    //认证:登录
    //在这里获取到用户输入的用户名、密码 去数据库做登录
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        char[] password1 = upToken.getPassword();

        //1、拿到用户输入的用户名、密码
        String userName = (String) token.getPrincipal();

        String password = new String((char[]) token.getCredentials());//这里密码是char数组

        log.info("进入MyRealm1,用户名:{}",userName);

        //2、和数据库中账号、密码做比对
        if(!"zhangsan".equals(userName)){//账号如果不存在
            throw new UnknownAccountException("账号不存在!");//shiro内置的一个异常类 我们也可以自定义异常类
        }

        if(!"123456".equals(password)){//密码不正确
            throw new IncorrectCredentialsException("密码不存在!");//shiro内置的一个异常类 我们也可以自定义异常类
        }

        //将认证/登录 成功的账号密码放到shiro环境中 我们在其他需要用账号的时候 可以获取
        return new SimpleAuthenticationInfo(userName,password,getName());
    }
}
